// hwinenvironment.h
#pragma once

#ifndef __HWINENVIRONMENT_H__
#define __HWINENVIRONMENT_H__

#include "hwindef.h"
#include "hwinobject.h"
#include "hwindatetime.h"



namespace harlinn
{
    namespace windows
    {
        enum class KnownFolderFlags : unsigned int
        {
            Default         = 0x00000000,
            NoAppContainerRedirection = 0x00010000,
            Create          = 0x00008000,
            DontVerify     = 0x00004000,
            DontUnexpand   = 0x00002000,
            NoAlias        = 0x00001000,
            Init            = 0x00000800,
            DefaultPath    = 0x00000400,
            NotParentRelative = 0x00000200,
            SimpleIDList   = 0x00000100,
            AliasOnly      = 0x80000000
        };
        DEFINE_ENUM_FLAG_OPERATORS(KnownFolderFlags)

        enum class AccessTimeoutFlags : DWORD
        {
            None = 0x0000,
            TimeOutOn = 0x0001,
            FeedbackOn = 0x0002
        };
        DEFINE_ENUM_FLAG_OPERATORS(AccessTimeoutFlags)

        struct AccessTimeOut
        {
            AccessTimeoutFlags Flags;
            TimeSpan TimeOut;
        };


        enum class FilterKeysFlags : DWORD
        {
            FilterKeysOn    = 0x00000001,
            Available       = 0x00000002,
            HotKeyActive    = 0x00000004,
            ConfirmHotKey   = 0x00000008,
            HotKeySound     = 0x00000010,
            Indicator       = 0x00000020,
            ClickOn         = 0x00000040
        };
        DEFINE_ENUM_FLAG_OPERATORS(FilterKeysFlags)

        struct FilterKeys
        {
            FilterKeysFlags Flags;
            TimeSpan Wait;
            TimeSpan Delay;
            TimeSpan Repeat;
            TimeSpan Bounce;
        };


        enum class HighContrastFlags : DWORD
        {
            HighContrastOn  = 0x00000001,
            Available       = 0x00000002,
            HotKeyActive    = 0x00000004,
            ConfirmHotKey   = 0x00000008,
            HotKeySound     = 0x00000010,
            Indicator       = 0x00000020,
            HotKeyAvailable = 0x00000040,
            LogonDesktop    = 0x00000100,
            DefaultDesktop  = 0x00000200
        };
        DEFINE_ENUM_FLAG_OPERATORS(HighContrastFlags)

        struct HighContrast
        {
            HighContrastFlags Flags;
            String DefaultScheme;
        };

        enum class MouseKeysFlags : DWORD
        {
            MouseKeysOn     = 0x00000001,
            Available       = 0x00000002,
            HotKeyActive    = 0x00000004,
            ConfirmHotKey   = 0x00000008,
            HotKeySound     = 0x00000010,
            Indicator       = 0x00000020,
            Modifiers       = 0x00000040,
            ReplaceNumbers  = 0x00000080,
            LeftButtonSel   = 0x10000000,
            RightButtonSel  = 0x20000000,
            LeftButtonDown  = 0x01000000,
            RightButtonDown = 0x02000000,
            MOUSEMODE       = 0x80000000
        };
        DEFINE_ENUM_FLAG_OPERATORS(MouseKeysFlags)


        struct MouseKeys
        {
            MouseKeysFlags Flags;
            DWORD MaxSpeed;
            TimeSpan TimeToMaxSpeed;
            DWORD CtrlSpeed;
        };


        enum class FontSmoothingOrientation : UINT
        {
            BGR   = 0x0000,
            RGB   = 0x0001
        };

        class Environment
        {
            HWIN_EXPORT Environment();
        public:
            HWIN_EXPORT static String GetResourceString(const wchar_t* key,...);
            HWIN_EXPORT static std::string GetResourceString(const char* key,...);
            HWIN_EXPORT static String GetResourceString(const String& key,...);

            HWIN_EXPORT static String NewLine();
            HWIN_EXPORT static String Expand(const String& s);



            class SystemParameters
            {
                HWIN_EXPORT SystemParameters();
            public:
                // Desktop
                HWIN_EXPORT static bool ClearType();
                HWIN_EXPORT static void SetClearType(bool theValue, bool sendChange = true, bool updateProfile = true);

                HWIN_EXPORT static String DesktopWallpaper();
                HWIN_EXPORT static void SetDesktopWallpaper(const String& theValue, bool sendChange = true, bool updateProfile = true);

                HWIN_EXPORT static bool DropShadow();
                HWIN_EXPORT static void SetDropShadow(bool theValue, bool sendChange = true, bool updateProfile = true);

                HWIN_EXPORT static bool FlatMenu();
                HWIN_EXPORT static void SetFlatMenu(bool theValue, bool sendChange = true, bool updateProfile = true);

                HWIN_EXPORT static bool FontSmoothing();
                HWIN_EXPORT static void SetFontSmoothing(bool theValue, bool sendChange = true, bool updateProfile = true);

                HWIN_EXPORT static UINT FontSmoothingContrast();
                HWIN_EXPORT static void SetFontSmoothingContrast(UINT theValue, bool sendChange = true, bool updateProfile = true);

                HWIN_EXPORT static harlinn::windows::FontSmoothingOrientation FontSmoothingOrientation();
                HWIN_EXPORT static void SetFontSmoothingOrientation(harlinn::windows::FontSmoothingOrientation theValue, bool sendChange = true, bool updateProfile = true);


                HWIN_EXPORT static std::shared_ptr<NONCLIENTMETRICS> NonClientMetrics();



            };

            class SystemMetrics
            {
                HWIN_EXPORT SystemMetrics();
            public:
                HWIN_EXPORT static int ScreenWidth();
                HWIN_EXPORT static int ScreenHeight();
                HWIN_EXPORT static SIZE ScreenSize();
                HWIN_EXPORT static int VerticalScrollBarWidth();
                HWIN_EXPORT static int HorizontalScrollBarHeight();
                HWIN_EXPORT static int CaptionHeight();
                HWIN_EXPORT static int BorderWidth();
                HWIN_EXPORT static int BorderHeight();
                HWIN_EXPORT static int VerticalScrollBarThumbHeight();
                HWIN_EXPORT static int HorizontalScrollBarThumbWidth();
                HWIN_EXPORT static int IconWidth();
                HWIN_EXPORT static int IconHeight();
                HWIN_EXPORT static SIZE IconSize();
                HWIN_EXPORT static int CursorWidth();
                HWIN_EXPORT static int CursorHeight();
                HWIN_EXPORT static SIZE CursorSize();
                HWIN_EXPORT static int MenuBarHeight();
                HWIN_EXPORT static int PrimaryDisplayWidth();
                HWIN_EXPORT static int PrimaryDisplayHeight();
                HWIN_EXPORT static SIZE PrimaryDisplaySize();
                HWIN_EXPORT static int KanjiWindowHeight();
                HWIN_EXPORT static int MousePresent();
                HWIN_EXPORT static int VerticalScrollBarArrowHeight();
                HWIN_EXPORT static int HorizontalScrollBarArrowWidth();
                HWIN_EXPORT static int IsDebugVersion();
                HWIN_EXPORT static int AreMouseButtonsSwapped();
                HWIN_EXPORT static int MinimumWindowWidth();
                HWIN_EXPORT static int MinimumWindowHeight();
                HWIN_EXPORT static SIZE MinimumWindowSize();
                HWIN_EXPORT static int CaptionButtonWidth();
                HWIN_EXPORT static int CaptionButtonHeight();
                HWIN_EXPORT static SIZE CaptionButtonSize();
                HWIN_EXPORT static int SizeableBorderWidth();
                HWIN_EXPORT static int SizeableBorderHeight();
                HWIN_EXPORT static int MinimumWindowResizableWidth();
                HWIN_EXPORT static int MinimumWindowResizableHeight();
                HWIN_EXPORT static int DoubleClickAreaWidth();
                HWIN_EXPORT static int DoubleClickAreaHeight();
                HWIN_EXPORT static SIZE DoubleClickAreaSize();
                HWIN_EXPORT static int IconViewCellWidth();
                HWIN_EXPORT static int IconViewCellHeight();
                HWIN_EXPORT static SIZE IconViewCellSize();
                HWIN_EXPORT static int DropDownMenusAreRightAligned();
                HWIN_EXPORT static int IsWindowsPenEnabled();
                HWIN_EXPORT static int DBCSEnabled();
                HWIN_EXPORT static int NumberOfMouseButtons();
                HWIN_EXPORT static int FixedBorderWidth();
                HWIN_EXPORT static int FixedBorderHeight();

                HWIN_EXPORT static int EdgeBorderWidth();
                HWIN_EXPORT static int EdgeBorderHeight();
                HWIN_EXPORT static int MinimizedWindowCellWidth();
                HWIN_EXPORT static int MinimizedWindowCellHeight();
                HWIN_EXPORT static int SmallIconWidth();
                HWIN_EXPORT static int SmallIconHeight();
                HWIN_EXPORT static SIZE SmallIconSize();
                HWIN_EXPORT static int SmallCaptionHeight();
                HWIN_EXPORT static int SmallCaptionButtonWidth();
                HWIN_EXPORT static int SmallCaptionButtonHeight();
                HWIN_EXPORT static SIZE SmallCaptionButtonSize();
                HWIN_EXPORT static int MenuBarButtonWidth();
                HWIN_EXPORT static int MenuBarButtonHeight();
                HWIN_EXPORT static SIZE MenuBarButtonSize();
                HWIN_EXPORT static int MinimizedWindowsArragement();
                HWIN_EXPORT static int MinimizedWindowWidth();
                HWIN_EXPORT static int MinimizedWindowHeight();
                HWIN_EXPORT static int MaximumWindowResizableWidth();
                HWIN_EXPORT static int MaximumWindowResizableHeight();
                HWIN_EXPORT static int PrimaryDisplayMaximumWindowWidth();
                HWIN_EXPORT static int PrimaryDisplayMaximumWindowHeight();
                HWIN_EXPORT static int NetworkIsPresent();
                HWIN_EXPORT static int CleanBoot();
                HWIN_EXPORT static int MinimumNoDragHorizontalMouseMovement();
                HWIN_EXPORT static int MinimumNoDragVerticalMouseMovement();
                HWIN_EXPORT static int ShowSounds();
                HWIN_EXPORT static int MenuCheckMarkWidth();
                HWIN_EXPORT static int MenuCheckMarkHeight();
                HWIN_EXPORT static SIZE MenuCheckMarkSize();
                HWIN_EXPORT static int SlowMachine();
                HWIN_EXPORT static int MiddleEastEnabled();
                HWIN_EXPORT static int MouseWheelPresent();
                HWIN_EXPORT static int VirtualScreenXPosition();
                HWIN_EXPORT static int VirtualScreenYPosition();
                HWIN_EXPORT static POINT VirtualScreenPosition();
                HWIN_EXPORT static int VirtualScreenWidth();
                HWIN_EXPORT static int VirtualScreenHeight();
                HWIN_EXPORT static SIZE VirtualScreenSize();
                HWIN_EXPORT static int NumberOfMonitors();
                HWIN_EXPORT static int MonitorsHasSameDisplayFormat();
                HWIN_EXPORT static int InputMethodManagerEnabled();
                HWIN_EXPORT static int FocusedBorderWidth();
                HWIN_EXPORT static int FocusedBorderHeight();
                HWIN_EXPORT static int TabletPC();
                HWIN_EXPORT static int MediaCenterPC();
                HWIN_EXPORT static int StarterEdition();
                HWIN_EXPORT static int WindowsServer2003R2BuildNumber();
                HWIN_EXPORT static int MouseHorizontalWheelPresent();
                HWIN_EXPORT static int CaptionedWindowBorderPadding();
                HWIN_EXPORT static int TabletPCInputTypeFlags();
                HWIN_EXPORT static int MaximumTouches();
                HWIN_EXPORT static int InTerminalServicesClientSession();
                HWIN_EXPORT static int ShuttingDown();
                HWIN_EXPORT static int IsTerminalServerSessionRemoteControlled();
                HWIN_EXPORT static int IsCaretBlinkingEnabled();
                HWIN_EXPORT static int ConvertibleSlateMode();
                HWIN_EXPORT static int IsSystemDocked();
                
            };



            class ComputerName
            {
                HWIN_EXPORT ComputerName();
                HWIN_EXPORT static String QueryComputerName(COMPUTER_NAME_FORMAT format);
            public:

                HWIN_EXPORT static String DnsDomain();
                HWIN_EXPORT static String DnsFullyQualified();
                HWIN_EXPORT static String DnsHostname();
                HWIN_EXPORT static String NetBIOS();
                HWIN_EXPORT static String PhysicalDnsDomain();
                HWIN_EXPORT static String PhysicalDnsFullyQualified();
                HWIN_EXPORT static String PhysicalDnsHostname();
                HWIN_EXPORT static String PhysicalNetBIOS();
            };


            class UserName
            {
                HWIN_EXPORT UserName();
                HWIN_EXPORT static String QueryUserName(EXTENDED_NAME_FORMAT format);
            public:
                HWIN_EXPORT static String FullyQualifiedDN();
                HWIN_EXPORT static String SamCompatible();
                HWIN_EXPORT static String Display();
                HWIN_EXPORT static String UniqueId();
                HWIN_EXPORT static String Canonical();
                HWIN_EXPORT static String UserPrincipal();
                HWIN_EXPORT static String CanonicalEx();
                HWIN_EXPORT static String ServicePrincipal();
                HWIN_EXPORT static String DnsDomain();
                HWIN_EXPORT static String GivenName();
                HWIN_EXPORT static String Surname();

            };


            class KnownFolder
            {
                HWIN_EXPORT KnownFolder();
                HWIN_EXPORT static String QueryKnownFolder(const GUID& folderId,KnownFolderFlags flags, HANDLE userToken);
            public:
                


                HWIN_EXPORT static String NetworkFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ComputerFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String InternetFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ControlPanelFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PrintersFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SyncManagerFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SyncSetupFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ConflictFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SyncResultsFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String RecycleBinFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ConnectionsFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Fonts(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Desktop(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Startup(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Programs(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String StartMenu(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Recent(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SendTo(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Documents(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Favorites(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String NetHood(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PrintHood(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Templates(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String CommonStartup(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String CommonPrograms(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String CommonStartMenu(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PublicDesktop(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ProgramData(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String CommonTemplates(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PublicDocuments(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String RoamingAppData(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String LocalAppData(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String LocalAppDataLow(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String InternetCache(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Cookies(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String History(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String System(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SystemX86(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Windows(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Profile(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Pictures(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ProgramFilesX86(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ProgramFilesCommonX86(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ProgramFilesX64(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ProgramFilesCommonX64(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ProgramFiles(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ProgramFilesCommon(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String UserProgramFiles(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String UserProgramFilesCommon(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String AdminTools(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String CommonAdminTools(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Music(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Videos(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Ringtones(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PublicPictures(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PublicMusic(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PublicVideos(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PublicRingtones(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ResourceDir(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String LocalizedResourcesDir(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String CommonOEMLinks(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String CDBurning(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String UserProfiles(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Playlists(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SamplePlaylists(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SampleMusic(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SamplePictures(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SampleVideos(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PhotoAlbums(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Public(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ChangeRemovePrograms(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String AppUpdates(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String AddNewPrograms(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Downloads(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PublicDownloads(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SavedSearches(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String QuickLaunch(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Contacts(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SidebarParts(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SidebarDefaultParts(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PublicGameTasks(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String GameTasks(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SavedGames(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Games(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SEARCH_MAPI(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SEARCH_CSC(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Links(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String UsersFiles(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String UsersLibraries(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String SearchHome(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String OriginalImages(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String DocumentsLibrary(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String MusicLibrary(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PicturesLibrary(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String VideosLibrary(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String RecordedTVLibrary(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String HomeGroup(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String HomeGroupCurrentUser(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String DeviceMetadataStore(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Libraries(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PublicLibraries(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String UserPinned(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ImplicitAppShortcuts(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String AccountPictures(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String PublicUserTiles(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String AppsFolder(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String ApplicationShortcuts(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String RoamingTiles(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String RoamedTileImages(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
                HWIN_EXPORT static String Screenshots(KnownFolderFlags flags = KnownFolderFlags::Default, HANDLE userToken = nullptr);
            };


        };
    }
}
#endif // __HWINENVIRONMENT_H__